<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>路由一个文档到一个分片中 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/routing-value.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/routing-value.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/routing-value.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/routing-value.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">基础入门</a></span>
»
<span class="breadcrumb-link"><a href="distributed-docs.html">分布式文档存储</a></span>
»
<span class="breadcrumb-node">路由一个文档到一个分片中</span>
</div>
<div class="navheader">
<span class="prev">
<a href="distributed-docs.html">« 分布式文档存储</a>
</span>
<span class="next">
<a href="how-primary-and-replica-shards-interact.html">主分片和副本分片如何交互 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="routing-value"></a>路由一个文档到一个分片中<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/040_Distributed_CRUD/05_Routing.asciidoc">edit</a>
</h2>
</div></div></div>
<p>当索引一个文档的时候，文档会被存储到一个主分片中。  Elasticsearch 如何知道一个文档应该存放到哪个分片中呢？当我们创建文档时，它如何决定这个文档应当被存储在分片 <code class="literal">1</code> 还是分片 <code class="literal">2</code> 中呢？</p>
<p>首先这肯定不会是随机的，否则将来要获取文档的时候我们就不知道从何处寻找了。实际上，这个过程是根据下面这个公式决定的：</p>
<pre class="literallayout">shard = hash(routing) % number_of_primary_shards</pre>

<p><code class="literal">routing</code> 是一个可变值，默认是文档的 <code class="literal">_id</code> ，也可以设置成一个自定义的值。 <code class="literal">routing</code> 通过 hash 函数生成一个数字，然后这个数字再除以 <code class="literal">number_of_primary_shards</code> （主分片的数量）后得到 <span class="strong strong"><strong>余数</strong></span> 。这个分布在 <code class="literal">0</code> 到 <code class="literal">number_of_primary_shards-1</code> 之间的余数，就是我们所寻求的文档所在分片的位置。</p>
<p>这就解释了为什么我们要在创建索引的时候就确定好主分片的数量  并且永远不会改变这个数量：因为如果数量变化了，那么所有之前路由的值都会无效，文档也再也找不到了。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>你可能觉得由于 Elasticsearch 主分片数量是固定的会使索引难以进行扩容。实际上当你需要时有很多技巧可以轻松实现扩容。我们将会在<a class="xref" href="scale.html" title="扩容设计"><em>扩容设计</em></a>一章中提到更多有关水平扩展的内容。</p>
</div>
</div>
<p>所有的文档 API（ <code class="literal">get</code> 、 <code class="literal">index</code> 、 <code class="literal">delete</code> 、 <code class="literal">bulk</code> 、 <code class="literal">update</code> 以及 <code class="literal">mget</code> ）都接受一个叫做 <code class="literal">routing</code> 的路由参数  ，通过这个参数我们可以自定义文档到分片的映射。一个自定义的路由参数可以用来确保所有相关的文档——例如所有属于同一个用户的文档——都被存储到同一个分片中。我们也会在<a class="xref" href="scale.html" title="扩容设计"><em>扩容设计</em></a>这一章中详细讨论为什么会有这样一种需求。</p>
</div>
<div class="navfooter">
<span class="prev">
<a href="distributed-docs.html">« 分布式文档存储</a>
</span>
<span class="next">
<a href="how-primary-and-replica-shards-interact.html">主分片和副本分片如何交互 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>